//package com.baocai.tools.aop;
//
//import com.dingyong.data.application.common.annotation.HideFieldWrape;
//import com.dingyong.data.application.dao.beans.TaskElement;
//import com.dingyong.data.application.dao.beans.TaskExam;
//import com.dingyong.data.application.dao.dto.StudentExamResultDto;
//import com.dingyong.data.application.dao.dto.StudentExaminationResultDto;
//import com.dingyong.data.application.service.HideWrapeService;
//import com.dingyong.data.application.service.TaskElementService;
//import com.dingyong.data.application.service.TaskExamService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * @author ：minyang
// * @date ：Created in 2020/3/6 13:20
// * 字段显示隐藏处理逻辑
// */
//@Service
//public class HideWrapeServiceImpl implements HideWrapeService {
//
//    @Autowired
//    TaskExamService taskExamService;
//
//    @Autowired
//    TaskElementService taskElementService;
//
//    public StudentExamResultDto hidegetStudentExamResultWrap(StudentExamResultDto dto) throws Exception
//    {
//        TaskExam taskExam = taskExamService.getLastTaskExam(dto.getExamId(),dto.getSchoolCode());
//        List<TaskElement> elements = taskElementService.getTaskElementMapList(taskExam.getId());
//        List<String> elementKeys = elements.stream().map(TaskElement :: getElementKey).collect(Collectors.toList());
//        Object result =  convertHide(dto,elementKeys);
//        return (StudentExamResultDto)result;
//    }
//
//    public StudentExaminationResultDto hidegetStudentSubjectResultWrap(StudentExaminationResultDto dto) throws Exception
//    {
//        TaskExam taskExam = taskExamService.getLastTaskExam(dto.getExamId(),dto.getSchoolCode());
//        List<TaskElement> elements = taskElementService.getTaskElementMapList(taskExam.getId());
//        List<String> elementKeys = elements.stream().map(TaskElement :: getElementKey).collect(Collectors.toList());
//        Object result =  convertHide(dto,elementKeys);
//        return (StudentExaminationResultDto)result;
//    }
//
//    private Object convertHide(Object dto,List<String> elementKeys) throws Exception{
//
//        // 首先得到pojo所定义的字段
//        Field[] fields = dto.getClass().getDeclaredFields();
//        for (Field curField : fields) {
//            // 设置字段可访问（必须，否则报错）
//            curField.setAccessible(true);
//            //判断字段上是否有注解
//            HideFieldWrape foo = curField.getAnnotation(HideFieldWrape.class);
//            //获取字段类型
//            Class<?> curFieldType = curField.getType();
//            if(foo !=null)
//            {
//                String describe = foo.describe();
//
//
//                boolean inner = foo.inner();
//                //不是内嵌指标，直接判断
//                if(!inner)
//                {
//                    if(!elementKeys.contains(describe))
//                    {
//                        curField.set(dto,null);
//                    }
//                }else {
//                    if(!curFieldType.equals(List.class))
//                    {
//                        Object ob = curField.get(dto);//获取该属性的值
//                        Object innerClass = convertHide(ob,elementKeys);
//                        curField.set(dto,innerClass);
//                    }else {
//                        //属性是list的情况
//                        //当前集合的泛型类型
//                    Type genericType = curField.getGenericType();
//                    if (null == genericType) {
//                        continue;
//                    }
//                    //这样判断type 是不是参数化类型。 如Collection<String>就是一个参数化类型。
//                    if (genericType instanceof ParameterizedType) {
//                        ParameterizedType pt = (ParameterizedType) genericType;
//                        //获取类型的类型参数类型。
//                        Class<?> actualTypeArgument = (Class<?>)pt.getActualTypeArguments()[0];
//                        List<Object> curEleList = new ArrayList<>();
//                        List ob = (List)curField.get(dto);//获取该属性的值
//                        for(int i=0;i<ob.size();i++)
//                        {
//                            Object obFrom = ob.get(i);
//                            Object obTo =convertHide(obFrom,elementKeys);
//                            curEleList.add(obTo);
//                        }
//                        curField.set(dto, curEleList);
//                    }
//                    }
//                }
//            }
//        }
//
//        return dto;
//    }
//
//}
